#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include<iostream>
#include<ctime>
#define NUM 4

pthread_mutex_t mutex;
int g_tickets=10000;

void* threadRoutine(void* args)
{
    char* name=static_cast<char*>(args);
    while(1)
    {
        pthread_mutex_lock(&mutex);
        if(g_tickets>0)
        {
            usleep(2000);
            std::cout<<name<<"get a ticket，还剩 "<<--g_tickets<<" 张票！\n";
            pthread_mutex_unlock(&mutex);
        }
        else
        {
           pthread_mutex_unlock(&mutex);
            break;
        }
    }
    //usleep(500);
    usleep(100);

    return nullptr;
}
int main()
{
    time_t start,end;
    double cpu_time_used;
    pthread_t tids[NUM];//构建四个线程
    start=clock();
    for(int i=0;i<NUM;i++)
    {
        char* name=new char[64];
        snprintf(name,64,"thread-%d ：",i+1);
        pthread_create(tids+i,nullptr,threadRoutine,name);

    }
    for(int i=0;i<NUM;i++)
    {
        pthread_join(tids[i],nullptr);
    }
    end=clock();
    cpu_time_used=(double)(end-start);
    std::cout<<"用时:"<<cpu_time_used<<" 回收结束\n";

    return 0;
}



////////////////////////////////////////////
// char* buf[5]; //字符指针数组  全局变量
// int pos; //用于指定上面数组的下标
 
// //1.定义互斥量
// pthread_mutex_t mutex;
 
// void *task(void *p)
// {
//     //3.使用互斥量进行加锁
//     pthread_mutex_lock(&mutex);
 
//     buf[pos] = (char *)p;
//     sleep(1);
//     pos++;
 
//     //4.使用互斥量进行解锁
//     pthread_mutex_unlock(&mutex);
// }
 
// int main(void)
// {
//     //2.初始化互斥量, 默认属性
//     pthread_mutex_init(&mutex, NULL);
 
//     //1.启动一个线程 向数组中存储内容
//     pthread_t tid, tid2;
//     pthread_create(&tid, NULL, task, (void *)"zhangfei");
//     pthread_create(&tid2, NULL, task, (void *)"guanyu");
//     //2.主线程进程等待,并且打印最终的结果
//     pthread_join(tid, NULL);
//     pthread_join(tid2, NULL);
//     //5.销毁互斥量
//     pthread_mutex_destroy(&mutex);
//     int i = 0;
//     printf("字符指针数组中的内容是：");
//     for(i = 0; i < pos; ++i)
//     {
//         printf("%s ", buf[i]);
//     }
//     printf("\n");
//     return 0;
// }

// int main (void)
// {
//     int err;
//     struct timespec tout;
//     struct tm *tmp;
//     char buf[64];
//     pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;    
//     pthread_mutex_lock (&lock);
//     printf ("mutex is locked\n");
//     clock_gettime (CLOCK_REALTIME, &tout);
//     tmp = localtime (&tout.tv_sec); 
//     strftime (buf, sizeof (buf), "%r", tmp);
//     printf ("current time is %s\n", buf);
//     tout.tv_sec += 10;
//     err = pthread_mutex_timedlock (&lock, &tout);
//     clock_gettime (CLOCK_REALTIME, &tout);
//     tmp = localtime (&tout.tv_sec);
//     strftime (buf, sizeof (buf), "%r", tmp);
//     printf ("the time is now %s\n", buf);
//     if (err == 0)
//         printf ("mutex locked again\n");
//     else 
//         printf ("can`t lock mutex again:%s\n", strerror (err));
//     return 0;
// }